#####################################################
# TargetUtils.cmake - 目标配置通用工具函数
# 
# 提供简化的目标配置接口，支持灵活的可见性控制
#####################################################

#####################################################
# 通用目标配置函数
# 参数说明：
#   target_name: 目标名称
#   PRIVATE_DEPS: 私有依赖库列表
#   PUBLIC_DEPS: 公共依赖库列表  
#   INTERFACE_DEPS: 接口依赖库列表
#   PRIVATE_COMPILE_DEFINITIONS: 私有编译定义列表
#   PUBLIC_COMPILE_DEFINITIONS: 公共编译定义列表
#   INTERFACE_COMPILE_DEFINITIONS: 接口编译定义列表
#   PRIVATE_INCLUDE_DIRECTORIES: 私有包含目录列表
#   PUBLIC_INCLUDE_DIRECTORIES: 公共包含目录列表
#   INTERFACE_INCLUDE_DIRECTORIES: 接口包含目录列表
#
# 使用示例：
# configure_target(my_target
#     PRIVATE_DEPS Threads::Threads spdlog::spdlog
#     PUBLIC_DEPS fmt::fmt
#     INTERFACE_DEPS some_header_only_lib
#     PRIVATE_INCLUDE_DIRECTORIES src/ internal/
#     PUBLIC_INCLUDE_DIRECTORIES include/
#     PRIVATE_COMPILE_DEFINITIONS DEBUG=1 INTERNAL_BUILD=1
#     PUBLIC_COMPILE_DEFINITIONS MY_LIB_VERSION=1
# )
#####################################################
function(configure_target target_name)
    # 解析命名参数
    set(options "")
    set(oneValueArgs "")
    set(multiValueArgs 
        PRIVATE_DEPS PUBLIC_DEPS INTERFACE_DEPS
        PRIVATE_COMPILE_DEFINITIONS PUBLIC_COMPILE_DEFINITIONS INTERFACE_COMPILE_DEFINITIONS
        PRIVATE_INCLUDE_DIRECTORIES PUBLIC_INCLUDE_DIRECTORIES INTERFACE_INCLUDE_DIRECTORIES
        # 保持向后兼容
        COMPILE_DEFINITIONS INCLUDE_DIRECTORIES
    )
    cmake_parse_arguments(ARG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
    
    message(STATUS "配置目标: ${target_name}")
    
    # 处理包含目录 - 私有
    if(ARG_PRIVATE_INCLUDE_DIRECTORIES)
        target_include_directories(${target_name} PRIVATE ${ARG_PRIVATE_INCLUDE_DIRECTORIES})
        message(STATUS "  私有包含目录: ${ARG_PRIVATE_INCLUDE_DIRECTORIES}")
    endif()
    
    # 处理包含目录 - 公共
    if(ARG_PUBLIC_INCLUDE_DIRECTORIES)
        target_include_directories(${target_name} PUBLIC ${ARG_PUBLIC_INCLUDE_DIRECTORIES})
        message(STATUS "  公共包含目录: ${ARG_PUBLIC_INCLUDE_DIRECTORIES}")
    endif()
    
    # 处理包含目录 - 接口
    if(ARG_INTERFACE_INCLUDE_DIRECTORIES)
        target_include_directories(${target_name} INTERFACE ${ARG_INTERFACE_INCLUDE_DIRECTORIES})
        message(STATUS "  接口包含目录: ${ARG_INTERFACE_INCLUDE_DIRECTORIES}")
    endif()
    
    # 向后兼容：INCLUDE_DIRECTORIES 默认为私有
    if(ARG_INCLUDE_DIRECTORIES)
        target_include_directories(${target_name} PRIVATE ${ARG_INCLUDE_DIRECTORIES})
        message(STATUS "  包含目录(私有): ${ARG_INCLUDE_DIRECTORIES}")
    endif()
    
    # 处理编译定义 - 私有
    if(ARG_PRIVATE_COMPILE_DEFINITIONS)
        target_compile_definitions(${target_name} PRIVATE ${ARG_PRIVATE_COMPILE_DEFINITIONS})
        message(STATUS "  私有编译定义: ${ARG_PRIVATE_COMPILE_DEFINITIONS}")
    endif()
    
    # 处理编译定义 - 公共
    if(ARG_PUBLIC_COMPILE_DEFINITIONS)
        target_compile_definitions(${target_name} PUBLIC ${ARG_PUBLIC_COMPILE_DEFINITIONS})
        message(STATUS "  公共编译定义: ${ARG_PUBLIC_COMPILE_DEFINITIONS}")
    endif()
    
    # 处理编译定义 - 接口
    if(ARG_INTERFACE_COMPILE_DEFINITIONS)
        target_compile_definitions(${target_name} INTERFACE ${ARG_INTERFACE_COMPILE_DEFINITIONS})
        message(STATUS "  接口编译定义: ${ARG_INTERFACE_COMPILE_DEFINITIONS}")
    endif()
    
    # 向后兼容：COMPILE_DEFINITIONS 默认为私有
    if(ARG_COMPILE_DEFINITIONS)
        target_compile_definitions(${target_name} PRIVATE ${ARG_COMPILE_DEFINITIONS})
        message(STATUS "  编译定义(私有): ${ARG_COMPILE_DEFINITIONS}")
    endif()
    
    # 链接私有依赖
    if(ARG_PRIVATE_DEPS)
        target_link_libraries(${target_name} PRIVATE ${ARG_PRIVATE_DEPS})
        message(STATUS "  私有依赖: ${ARG_PRIVATE_DEPS}")
    endif()
    
    # 链接公共依赖
    if(ARG_PUBLIC_DEPS)
        target_link_libraries(${target_name} PUBLIC ${ARG_PUBLIC_DEPS})
        message(STATUS "  公共依赖: ${ARG_PUBLIC_DEPS}")
    endif()
    
    # 链接接口依赖
    if(ARG_INTERFACE_DEPS)
        target_link_libraries(${target_name} INTERFACE ${ARG_INTERFACE_DEPS})
        message(STATUS "  接口依赖: ${ARG_INTERFACE_DEPS}")
    endif()
endfunction()
